package com.cusnews.app.fragments;
import java.lang.ref.WeakReference;
import java.security.NoSuchAlgorithmException;
import java.util.List;
import android.app.Activity;
import android.content.Context;
import android.databinding.DataBindingUtil;
import android.os.Bundle;
import android.support.v4.app.ActivityCompat;
import android.support.v4.app.DialogFragment;
import android.support.v4.app.Fragment;
import android.support.v7.widget.PopupMenu;
import android.view.LayoutInflater;
import android.view.MenuItem;
import android.view.MenuItem.OnMenuItemClickListener;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.ViewGroup;
import android.widget.EditText;
import com.cusnews.BR;
import com.cusnews.R;
import com.cusnews.api.Api;
import com.cusnews.app.App;
import com.cusnews.databinding.CustomizedTopicsBinding;
import com.cusnews.ds.PushToken;
import com.cusnews.ds.Trends;
import com.cusnews.utils.DeviceUniqueUtil;
import com.cusnews.utils.Prefs;
import com.cusnews.utils.Utils;
import cn.bmob.v3.BmobQuery;
import cn.bmob.v3.listener.FindListener;
import cn.bmob.v3.listener.UpdateListener;
import retrofit.Callback;
import retrofit.RetrofitError;
import retrofit.client.Response;
/**
* A dialog to define customized topics.
*
* @author Xinyue Zhao
*/
public final class CustomizedTopicsFragment extends DialogFragment {
/**
* Main layout for this component.
*/
private static final int LAYOUT = R.layout.fragment_customized_topics;
/**
* "menu" of current trends from
* <p/>
* <a href="http://www.faroo.com">Faroo.com</a>
*/
private static final int TRENDS_SELECTION = R.menu.trends_selection;
/**
* Data-binding.
*/
private CustomizedTopicsBinding mBinding;
public static CustomizedTopicsFragment newInstance( Context context ) {
return (CustomizedTopicsFragment) Fragment.instantiate( context, CustomizedTopicsFragment.class.getName() );
}
@Override
public View onCreateView( LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState ) {
return inflater.inflate( LAYOUT, container, false );
}
@Override
public void onViewCreated( View view, Bundle savedInstanceState ) {
super.onViewCreated( view, savedInstanceState );
mBinding = DataBindingUtil.bind( view.findViewById( R.id.topics_fl ) );
//Click "ok" to save current values.
mBinding.closeVg.setOnClickListener( new OnClickListener() {
@Override
public void onClick( View v ) {
if( !Utils.validateKeyword( mBinding.oneEt ) || !Utils.validateKeyword( mBinding.twoEt ) ||
!Utils.validateKeyword( mBinding.threeEt ) || !Utils.validateKeyword( mBinding.fourEt ) ||
!Utils.validateKeyword( mBinding.fiveEt ) ) {
return;
}
mBinding.closeBtn.setVisibility( View.INVISIBLE );
mBinding.savePb.setVisibility( View.VISIBLE );
mBinding.oneEt.setEnabled( false );
mBinding.twoEt.setEnabled( false );
mBinding.threeEt.setEnabled( false );
mBinding.fourEt.setEnabled( false );
mBinding.fiveEt.setEnabled( false );
String deviceId = "0000000000";
try {
deviceId = DeviceUniqueUtil.getDeviceIdent( App.Instance );
} catch( NoSuchAlgorithmException e ) {
}
Prefs prefs = Prefs.getInstance();
BmobQuery<PushToken> query = new BmobQuery<>();
query.addWhereEqualTo( "mGoogleId", prefs.getGoogleId() );
query.addWhereEqualTo( "mDeviceId", deviceId );
query.findObjects( App.Instance, new FindListener<PushToken>() {
@Override
public void onSuccess( List<PushToken> list ) {
if( list.size() > 0 ) {
PushToken pushToken = list.get( 0 );
pushToken.setCustomizedTopic1( mBinding.oneEt.getText().toString() );
pushToken.setCustomizedTopic2( mBinding.twoEt.getText().toString() );
pushToken.setCustomizedTopic3( mBinding.threeEt.getText().toString() );
pushToken.setCustomizedTopic4( mBinding.fourEt.getText().toString() );
pushToken.setCustomizedTopic5( mBinding.fiveEt.getText().toString() );
pushToken.update( App.Instance, pushToken.getObjectId(), new UpdateListener() {
@Override
public void onSuccess() {
Activity activity = getActivity();
if( activity != null ) {
ActivityCompat.finishAfterTransition( activity );
}
}
@Override
public void onFailure( int i, String s ) {
mBinding.closeBtn.setText( R.string.btn_retry );
mBinding.closeBtn.setVisibility( View.VISIBLE );
mBinding.savePb.setVisibility( View.INVISIBLE );
mBinding.oneEt.setEnabled( true );
mBinding.twoEt.setEnabled( true );
mBinding.threeEt.setEnabled( true );
mBinding.fourEt.setEnabled( true );
mBinding.fiveEt.setEnabled( true );
}
} );
}
}
@Override
public void onError( int i, String s ) {
mBinding.closeBtn.setText( R.string.btn_retry );
mBinding.closeBtn.setVisibility( View.VISIBLE );
mBinding.savePb.setVisibility( View.INVISIBLE );
mBinding.oneEt.setEnabled( true );
mBinding.twoEt.setEnabled( true );
mBinding.threeEt.setEnabled( true );
mBinding.fourEt.setEnabled( true );
mBinding.fiveEt.setEnabled( true );
}
} );
}
} );
//Get data from backend to refresh UI.
String deviceId = "0000000000";
try {
deviceId = DeviceUniqueUtil.getDeviceIdent( App.Instance );
} catch( NoSuchAlgorithmException e ) {
}
Prefs prefs = Prefs.getInstance();
BmobQuery<PushToken> query = new BmobQuery<>();
query.addWhereEqualTo( "mGoogleId", prefs.getGoogleId() );
query.addWhereEqualTo( "mDeviceId", deviceId );
query.findObjects( App.Instance, new FindListener<PushToken>() {
@Override
public void onSuccess( List<PushToken> list ) {
mBinding.oneEt.setEnabled( true );
mBinding.twoEt.setEnabled( true );
mBinding.threeEt.setEnabled( true );
mBinding.fourEt.setEnabled( true );
mBinding.fiveEt.setEnabled( true );
if( list.size() > 0 ) {
mBinding.setVariable( BR.pushToken, list.get( 0 ) );
}
mBinding.closeBtn.setVisibility( View.VISIBLE );
mBinding.savePb.setVisibility( View.INVISIBLE );
}
@Override
public void onError( int i, String s ) {
mBinding.oneEt.setEnabled( true );
mBinding.twoEt.setEnabled( true );
mBinding.threeEt.setEnabled( true );
mBinding.fourEt.setEnabled( true );
mBinding.fiveEt.setEnabled( true );
mBinding.closeBtn.setVisibility( View.VISIBLE );
mBinding.savePb.setVisibility( View.INVISIBLE );
}
} );
//Get trends.
Api.getTopTrends( "", Prefs.getInstance().getLanguage(), App.Instance.getApiKey(), new Callback<Trends>() {
@Override
public void success( Trends trends, Response response ) {
Activity activity = getActivity();
if( activity != null ) {
List<String> listOfTrends = trends.getList();
mBinding.trendsOneBtn.setVisibility( View.VISIBLE );
final PopupMenu oneMenu = new PopupMenu( activity, mBinding.trendsOneBtn );
oneMenu.inflate( TRENDS_SELECTION );
initMenu( oneMenu, listOfTrends, mBinding.oneEt );
mBinding.trendsOneBtn.setOnClickListener( new OnClickListener() {
@Override
public void onClick( View v ) {
oneMenu.show();
}
} );
mBinding.trendsTwoBtn.setVisibility( View.VISIBLE );
final PopupMenu twoMenu = new PopupMenu( activity, mBinding.trendsTwoBtn );
twoMenu.inflate( TRENDS_SELECTION );
initMenu( twoMenu, listOfTrends, mBinding.twoEt );
mBinding.trendsTwoBtn.setOnClickListener( new OnClickListener() {
@Override
public void onClick( View v ) {
twoMenu.show();
}
} );
mBinding.trendsThreeBtn.setVisibility( View.VISIBLE );
final PopupMenu threeMenu = new PopupMenu( activity, mBinding.trendsThreeBtn );
threeMenu.inflate( TRENDS_SELECTION );
initMenu( threeMenu, listOfTrends, mBinding.threeEt );
mBinding.trendsThreeBtn.setOnClickListener( new OnClickListener() {
@Override
public void onClick( View v ) {
threeMenu.show();
}
} );
mBinding.trendsFourBtn.setVisibility( View.VISIBLE );
final PopupMenu fourMenu = new PopupMenu( activity, mBinding.trendsFourBtn );
fourMenu.inflate( TRENDS_SELECTION );
initMenu( fourMenu, listOfTrends, mBinding.fourEt );
mBinding.trendsFourBtn.setOnClickListener( new OnClickListener() {
@Override
public void onClick( View v ) {
fourMenu.show();
}
} );
mBinding.trendsFiveBtn.setVisibility( View.VISIBLE );
final PopupMenu fiveMenu = new PopupMenu( activity, mBinding.trendsFiveBtn );
fiveMenu.inflate( TRENDS_SELECTION );
initMenu( fiveMenu, listOfTrends, mBinding.fiveEt );
mBinding.trendsFiveBtn.setOnClickListener( new OnClickListener() {
@Override
public void onClick( View v ) {
fiveMenu.show();
}
} );
}
}
private void initMenu( PopupMenu popupMenu, List<String> listOfTrends, EditText targetEt ) {
final WeakReference<EditText> etwp = new WeakReference<>( targetEt );
for( String trend : listOfTrends ) {
popupMenu.getMenu().add( trend ).setOnMenuItemClickListener( new OnMenuItemClickListener() {
@Override
public boolean onMenuItemClick( MenuItem item ) {
if( etwp.get() != null ) {
EditText editText = etwp.get();
editText.setText( item.getTitle() );
}
return false;
}
} );
}
}
@Override
public void failure( RetrofitError error ) {
}
} );
}
}